package Leetcode;

/**
 * 这题要注意，不能直接替换，因为替换了，后面的就会有误判， 所以这个是有坑的。 中间的循环要注意i，那个都是从第二行第二列开始的
 *
 * 给定一个 m x n 的矩阵，如果一个元素为 0，则将其所在行和列的所有元素都设为 0。请使用原地算法。
 *示例 2:
 * 输入:
 * [
 *   [0,1,2,0],
 *   [3,4,5,2],
 *   [1,3,1,5]
 * ]
 * 输出:
 * [
 *   [0,0,0,0],
 *   [0,4,5,0],
 *   [0,3,1,0]
 * ]
 */
public class L73_矩阵置0 {
    public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        boolean row_has0 = false, col_has0=false;

        //这个要纸上画一下，给弄错了
        for(int i=0; i<row; i++){
            if(matrix[i][0] ==0){
                col_has0 = true;
            }
        }
        for(int j=0; j<col;j++){
            if(matrix[0][j] ==0){
                row_has0 = true;
            }
        }
        //要从第二行、第二列开始不然会重复的。。
        for(int i=1; i< row;i++){
            for(int j=1; j<col; j++){
                if(matrix[i][j] == 0){
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        //置零也要从第二行、第二列开始，因为，第一行只是借用的，算是临时变量
        for(int i=1; i<row; i++){
            for(int j=1; j<col; j++){
                if(matrix[0][j] == 0 || matrix[i][0] == 0){
                    matrix[i][j] = 0;
                }
            }
        }
        //处理行首
        if(row_has0){
            for(int j=0; j<col; j++){
                matrix[0][j]=0;
            }
        }
        if(col_has0){
            for(int i=0; i<row; i++){
                matrix[i][0]=0;
            }
        }
    }
}
